home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / readers / skim-0.8 / skim-0 / skim-0.8.4 / ConstructArticle.c < prev    next >
C/C++ Source or Header  |  1996-02-18  |  7KB  |  281 lines

  1. /*
  2.  * NAME
  3.  *   ConstructArticle.c
  4.  * USAGE
  5.  *   Usage: ConstructArticle ArticleFile
  6.  * DESCRIPTION
  7.  *   This program gets information from the caller and from the environment.
  8.  *   It uses the constructors of the Article class to construct an article.
  9.  *   The article is saved in a file.
  10.  *
  11.  *   See also 'skim replyto' and 'skim newarticle'. Don't run this program 
  12.  *   directly.
  13.  * COPYRIGHT
  14.  *   Skim - Off-line news reading package optimized for slow lines.
  15.  *   Copyright (C) 1996  Rene W.J. Pijlman
  16.  *
  17.  *   This program is free software; you can redistribute it and/or modify
  18.  *   it under the terms of the GNU General Public License as published by
  19.  *   the Free Software Foundation; either version 2 of the License, or
  20.  *   (at your option) any later version.
  21.  * 
  22.  *   This program is distributed in the hope that it will be useful,
  23.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  24.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25.  *   GNU General Public License for more details.
  26.  * 
  27.  *   You should have received a copy of the GNU General Public License
  28.  *   along with this program; if not, write to the Free Software
  29.  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  30.  * VERSION
  31.  *   Skim version 0.8.4.
  32.  */
  33.  
  34. #include <assert.h>
  35.  
  36. #include "Skim.h"
  37. #include "SkimUtils.h"
  38. #include "VarBuf.h"
  39. #include "StandardIO.h"
  40. #include "Article.h"
  41.  
  42. FILE_ID("$Header#");
  43.  
  44.  
  45. static VarBuf CreateReplyToArticleVB( VarBuf OriginalFileContent )
  46. {
  47.     VarBuf New = NULL;
  48.     VarBuf Signature = NULL;
  49.     VarBuf X_NewsReader = NULL;
  50.     VarBuf From = NULL;
  51.     VarBuf Path = NULL;
  52.     VarBuf ReplyTo = NULL;
  53.     VarBuf Organization = NULL;
  54.     VarBuf ErrorMessages = NULL;
  55.     Article Reply = NULL;
  56.     Boolean Success = True;
  57.     Article Original = ArticleCreate();
  58.  
  59.     ArticleSetVB( Original, OriginalFileContent );
  60.  
  61.     if ( ArticleIsOKAndComplete( Original ) )
  62.     {
  63.         ItemsFromEnvironment( &Signature, &X_NewsReader, &From, &ReplyTo,
  64.                   &Path, &Organization );
  65.  
  66.     Reply = ArticleConstructReply( Original, From, Path, ReplyTo,
  67.                                    Organization, Signature, X_NewsReader );
  68.     assert( ArticleIsOKAndComplete(Reply) );
  69.  
  70.     New = ArticleGetVB( Reply );
  71.     }
  72.     else
  73.     {
  74.     Success = False;
  75.  
  76.     SIOPrintf( StandardError, "Error: %V",
  77.                        ArticleGetErrorMessages(Original) );
  78.     }
  79.  
  80.     ArticleDestroy( Original );
  81.     ArticleDestroy( Reply );
  82.     VBDestroy(Signature);
  83.     VBDestroy(X_NewsReader);
  84.     VBDestroy(From);
  85.     VBDestroy(Path);
  86.     VBDestroy(ReplyTo);
  87.     VBDestroy(Organization);
  88.     VBDestroy(ErrorMessages);
  89.  
  90.     if ( !Success )
  91.     {
  92.     VBDestroy( New );
  93.     New = NULL;
  94.     }
  95.  
  96.     return New;
  97. }
  98.  
  99.  
  100. static Boolean CreateReplyToArticleFile(
  101.     const char * OriginalFileName,
  102.     const char * ReplyFileName )
  103. {
  104.     StandardIO OriginalFile = SIOCreate();
  105.     VarBuf OriginalFileContent = VBCreate();
  106.     VarBuf ReplyFileContent = NULL;
  107.     StandardIO ReplyFile = SIOCreate();
  108.     Boolean Success = True;
  109.  
  110.     if ( SIOFileExists( ReplyFileName ) )
  111.     {
  112.     Success = False;
  113.     SIOPrintf( StandardError, "Error: File %s already exists\n", 
  114.                        ReplyFileName );
  115.     }
  116.  
  117.     if ( Success )
  118.     {
  119.     SIOFileOpen( OriginalFile, OriginalFileName, OpenModeRead );
  120.     SIOFileOpen( ReplyFile, ReplyFileName, OpenModeWrite );
  121.  
  122.     VBReadFile( OriginalFileContent, OriginalFile );
  123.  
  124.     ReplyFileContent = CreateReplyToArticleVB( OriginalFileContent );
  125.  
  126.     if ( ReplyFileContent != NULL )
  127.     {
  128.         VBWriteFile( ReplyFileContent, ReplyFile );
  129.     }
  130.     }
  131.  
  132.     VBDestroy( OriginalFileContent );
  133.     SIODestroy( OriginalFile );
  134.     VBDestroy( ReplyFileContent );
  135.     SIODestroy( ReplyFile );
  136.  
  137.     return Success;
  138. }
  139.  
  140.  
  141. static Boolean CreateNewArticleFile(
  142.     const char * FileName,
  143.     const char * NewsGroupsAsString,
  144.     const char * SubjectAsString )
  145. {
  146.     StandardIO NewArticle = SIOCreate();
  147.     VarBuf NewArticleFileName = VBCreate();
  148.     Boolean Success = True;
  149.  
  150.     VarBuf Signature = NULL;
  151.     VarBuf X_NewsReader = NULL;
  152.     VarBuf From = NULL;
  153.     VarBuf Path = NULL;
  154.     VarBuf ReplyTo = NULL;
  155.     VarBuf Organization = NULL;
  156.     VarBuf NewsGroups = VBCreate();
  157.     VarBuf Subject = VBCreate();
  158.  
  159.     VBPrintf( NewsGroups, "%s", NewsGroupsAsString );
  160.     VBPrintf( Subject, "%s", SubjectAsString );
  161.  
  162.     VBPrintf( NewArticleFileName, "%s/Post/%s",
  163.           SkimDirectory(), FileName );
  164.  
  165.     if ( !SIOFileExists( VBAsString(NewArticleFileName) ) )
  166.     {
  167.     StandardIO NewArticleFile = SIOCreate();
  168.     VarBuf NewArticleVB = NULL;
  169.     Article NewArticle = NULL;
  170.  
  171.     SIOFileOpen( NewArticleFile, VBAsString(NewArticleFileName),
  172.                  OpenModeWrite );
  173.  
  174.         ItemsFromEnvironment( &Signature, &X_NewsReader, &From, &ReplyTo,
  175.                   &Path, &Organization );
  176.  
  177.     NewArticle = ArticleConstructNew( NewsGroups, Subject, From, Path, 
  178.                                       ReplyTo, Organization, Signature,
  179.                       X_NewsReader );
  180.  
  181.     NewArticleVB = ArticleGetVB( NewArticle );
  182.  
  183.     if ( NewArticleVB != NULL )
  184.     {
  185.         VBWriteFile( NewArticleVB, NewArticleFile );
  186.     }
  187.  
  188.     SIODestroy( NewArticleFile );
  189.     VBDestroy( NewArticleVB );
  190.     ArticleDestroy( NewArticle );
  191.     }
  192.     else
  193.     {
  194.     SIOPrintf( StandardError, "Error: File %s already exists\n", 
  195.                        FileName );
  196.     Success = False;
  197.     }
  198.     
  199.     VBDestroy( NewArticleFileName );
  200.     SIODestroy( NewArticle );
  201.     VBDestroy(Subject);
  202.     VBDestroy(Signature);
  203.     VBDestroy(X_NewsReader);
  204.     VBDestroy(From);
  205.     VBDestroy(Path);
  206.     VBDestroy(ReplyTo);
  207.     VBDestroy(Organization);
  208.     VBDestroy( NewsGroups );
  209.  
  210.     return Success;
  211. }
  212.  
  213.  
  214. #define USAGE "Usage:\n" \
  215.    "\tConstructArticle new Filename NewsGroups Subject\n" \
  216.    "\tConstructArticle reply ArticleFilename ...\n"
  217.  
  218. int main( int argc, char **argv )
  219. {
  220.     Boolean Success = True;
  221.     int i;
  222.  
  223.     if ( !getenv("IAmSkim") )
  224.     {
  225.         SIOPrintf( StandardError, "%s\n",
  226.       "You appear to be running %s directly. Use 'skim replyto' instead.",
  227.                            argv[0] );
  228.         exit( EXIT_FAILURE );
  229.     }
  230.  
  231.     if ( !getenv("SKIMFROM") )
  232.     {
  233.         SIOPrintf( StandardError, "%s\n",
  234.           "Environment variable SKIMFROM is not set" );
  235.         exit( EXIT_FAILURE );
  236.     }
  237.  
  238.     if ( argc > 2 && !strcmp( argv[1], "reply" ) )
  239.     {
  240.     for ( i = 2; Success && i < argc; i++ )
  241.     {
  242.         if ( strlen(argv[i]) > 0 )
  243.         {
  244.         VarBuf OriginalFileName = VBCreate();
  245.         VarBuf ReplyFileName = VBCreate();
  246.  
  247.         VBPrintf( OriginalFileName, "%s/Articles/%s",
  248.               SkimDirectory(), argv[i] );
  249.         VBPrintf( ReplyFileName, "%s/Post/%s.reply",
  250.               SkimDirectory(), argv[i] );
  251.  
  252.         Success = CreateReplyToArticleFile( 
  253.                       VBAsString(OriginalFileName),
  254.                   VBAsString(ReplyFileName) );
  255.  
  256.         VBDestroy(OriginalFileName);
  257.         VBDestroy(ReplyFileName);
  258.         }
  259.     }
  260.     }
  261.     else if ( argc > 4 && !strcmp( argv[1], "new" ) )
  262.     {
  263.     if ( strlen(argv[2]) > 0 && strlen(argv[3]) > 0 && strlen(argv[4]) > 0 )
  264.     {
  265.         Success = CreateNewArticleFile( argv[2], argv[3], argv[4] );
  266.     }
  267.     else
  268.     {
  269.         SIOPrintf( StandardError, "%s\n", USAGE );
  270.         exit( EXIT_FAILURE );
  271.     }
  272.     }
  273.     else
  274.     {
  275.         SIOPrintf( StandardError, "%s\n", USAGE );
  276.         exit( EXIT_FAILURE );
  277.     }
  278.  
  279.     return Success ? EXIT_SUCCESS : EXIT_FAILURE;
  280. }
  281.